from pathlib import Path
from app.tool import BaseTool
from app.utils import get_project_root

class PathConverter(BaseTool):
    """路径转换工具，用于处理相对路径和绝对路径的转换"""

    name: str = "path_converter"
    description: str = (
        "本地文件操作路径转换工具"
        "所有涉及本地文件操作的工具，如果用户提供的不是绝对路径，都应该使用此工具进行转换"
        "自动将相对路径转换为基于项目根目录的绝对路径"
        "如果已经是绝对路径，则保持不变"
        "确保所有文件操作使用统一的绝对路径格式，避免路径不一致导致的问题"
    )
    
    parameters: str = {
        "type": "object",
        "properties": {
            "path": {
                "type": "string",
                "description": "需要转换的路径",
            },
            "to_absolute": {
                "type": "boolean",
                "description": "是否转换为绝对路径，默认为True",
                "default": True
            }
        },
        "required": ["path"],
    }

    async def execute(self, path: str, to_absolute: bool = True) -> str:
        """执行路径转换
        
        Args:
            path: 需要转换的路径
            to_absolute: 是否转换为绝对路径，默认为True
            
        Returns:
            str: 转换后的路径
        """
        path_obj = Path(path)
        root_dir = get_project_root()
        
        if to_absolute:
            # 转换为绝对路径
            if not path_obj.is_absolute():
                # 如果是相对路径，则相对于项目根目录
                return str(root_dir /"workspace" / path_obj)
            return str(path_obj)
        else:
            # 转换为相对路径
            if path_obj.is_absolute():
                try:
                    # 尝试转换为相对于项目根目录的路径
                    return str(path_obj.relative_to(root_dir))
                except ValueError:
                    # 如果无法转换为相对路径，则返回原始路径
                    return str(path_obj)
            return str(path_obj) 